AWSのプライベートサブネットからSES経由でメールを送信する

Pocket

はじめに

AWSにまだ慣れてない人から「プライベートサブネット上にあるEC2インスタンスからメールを送信したいのだけど、どうすればいい?」という質問を何度か受けているので、これを機にまとめてみようと思います。

軽くSESの復習

SESはAWSが提供するメール送受信サービスです。AWS上に構築したシステムからメールを送信したいケースは沢山あると思うのですが、そのようなケースで真っ先に検討すべきはSESの利用です。

SESを使えば、自分でメールサーバを構築しなくてもメール送受信ができるようになります。料金は従量課金です。毎月62,000通の送信と、1,000通の受信までの無料利用枠があり、それを超えたら送受信共に1,000通ごとに0.10USドルかかります。この無料利用枠は最初の1年間が過ぎても続きます。(送信元がEC2インスタンスかどうか、メールに添付ファイルがあるかどうか等で料金が変わってくるので、詳細はAWS公式のSESの料金説明ページをご確認ください。)

SESは設定すればすぐに使えるようになるのですが、注意すべき点を一つ上げるとすれば、初期設定でメール送信に一定の制限がかかっているという点です。これはAWS環境からスパムや悪質なメールを送信させないようにするためです。「AWS SES サンドボックス 解除」で検索すれば親切に説明してくださってるサイト様がたくさん見つかりますので、そちらを参考にしてください。(他力本願!)

プライベートサブネットからのメール送信

さて、本題の「プライベートサブネット上にあるEC2インスタンスからメールを送信したいのだけど、どうすればいい?」なのですが、その前に「パブリックサブネット上にあるEC2インスタンスからメールを送信する」時の図を見てください。

「あれ、メール送信するのに一度インターネットに出てる?」と気付いた方。そうなんです。この構成だと一旦AWS外に出て、インターネットを経由して、またAWSに戻ってくるのです。なので、プライベートサブネットにあるEC2インスタンスからSESを使ってメールを送信しようとしても送信できません。

このようなケースでは、VPCエンドポイントを使いましょう。VPCエンドポイントは、特定のサービス(今回の場合はSES)に直結するトンネルを設置するイメージです。図にするとこうなります。

 

VPCエンドポイントは、今回のように「インターネットに出られない環境からAWSの特定のサービスと通信したい」時や「セキュリティポリシー的に、通信をインターネット経由にしたくない」という時に使うサービスです。SESだけでなく、色々なサービスのエンドポイントが提供されていますので、是非覚えておきましょう。

VPCエンドポイントじゃなくて、NATゲートウェイを使ってもいいよね?と思った方。はい。もちろんです。どちらを選ぶかは、機能やセキュリティ的な理由、料金等を総合的に判断して選べばいいと思います。

VPCエンドポイントを作ってみよう

さて、それでは実際にVPCエンドポイントを作成してみましょう。AWSマネジメントコンソールにログインして、VPC→エンドポイント→エンドポイントの作成をクリックします。

 

サービスカテゴリで「AWSサービス」を選択し、サービス名の中からSESを選択します。しかしSESで検索しても出てこないので、「email」で検索して、「com.amazonaws.ap-northeast-1.email-smtp」を選択しましょう。

 

あとはVPCエンドポイントを設置するVPCとサブネットを選択します。サブネットは複数指定可能ですが、1AZあたり1つのサブネットしか指定できないので注意してください。(余談ですが、「同じAZの複数のプライベートサブネットからメールを送信したいけど、サブネット間の通信は許可していないんです!」という場合は、VCPエンドポイントを複数作成すれば、同じAZの中に複数のVPCエンドポイントできます。)以下はAZ-A、AZ-C、AZ-DのそれぞれにVPCエンドポイントを設置する例です。

その次にある設定項目「Enable DNS name」は、この後説明しますが、1つのVPCの中に他にSES用のVPCエンドポイントがなく、今後増える予定がないのであれば、チェックを入れたままにしておけば良いと思います。

あとはセキュリティグループやタグを設定し、「エンドポイントの作成」を押せば、SES用のVPCエンドポイントが作成されます。利用可能になるまで少し時間がかかるので待ちましょう。

Enable DNS nameの設定は何のため?

「Enable DNS」にチェックを入れてVPCエンドポイントを作成すると、SESのエンドポイント名でVPCエンドポイントにアクセスできるようになります。例えばすでに東京リージョンのSESを使っている場合、SMTPエンドポイント「 email-smtp.ap-northeast-1.amazonaws.com 」にメールを送信するよ、という設定がシステムのどこかにあるはずですが、この「 email-smtp.ap-northeast-1.amazonaws.com 」という名前をVPCエンドポイントに付け替えてしまうイメージです。何のメリットがあるかというと、VPCエンドポイントを有効にした後のシステム側の設定変更が不要になります。システムはずっと同じ相手に「これを転送してね、よろしく!」とメールを送り続けているつもりなのですが、途中から相手がSMTPエンドポイントからVPCエンドポイントに切り替わっている、そんなイメージです。もちろん、この挙動がありがたい時もあれば、まったくもって不要だという時もあるので、有効にするかどうかは都度判断してください。ちなみに、1つのVPCの中に同種類のVPCエンドポイントを作成する場合、2個目のVPCエンドポイントでも「Enable DNS」を有効にしようとすると「private-dns-enabled cannot be set because there is already a conflicting DNS domain for email-smtp.ap-northeast-1.amazonaws.com in the VPC vpc-********(もうその名前は使っているよ!)」というエラーになるのでご注意を。

君(VPCエンドポイント)の名は

Enable DNS関連の話が続くのですが、もしEnable DNSをオフにしてVPCエンドポイントを作った場合、どのようなDNS名でアクセスすればいいのでしょう?

先程作成した3つのAZで有効なVPCエンドポイントで詳細を確認しましょう。作成したVPCエンドポイントの「詳細」タブを選択すると右側に表示されています。

おっと、沢山ありますね。順に見ていきましょう。DNS名の中に vpce- から始まるものが4つありますね。

最初の1つは、リージョン単位のVPCエンドポイント名を指すDNS名です。nslookup結果はこうなります。

 
結果として、AZにあるVPCエンドポイント3つが返ってきます。(実際にメールを送信する際には、これらのVPCエンドポイントのどれか経由でSESに行くことになります。)

残りの3つはそれぞれのAZのVPCエンドポイントです。確認するとこうなります。よく見ればDNS名に「ap-northeast-1a」、「ap-northeast-1c」、「ap-northeast-1d」とあるので、どのAZにあるものかがわかるようになっていますね。

ということで、これらのDNS名はケースバイケースで使い分けしましょう。1つのAZで障害が発生した時に無事なAZにあるVPCエンドポイント経由でメールを送信したい場合は、一番上にあるリージョン単位のVPCエンドポイントを使い、送り先を固定したい場合は2番目以降のDNS名使えばいいでしょう。

VPCエンドポイントの料金について

さてさて、最後に料金の話もしておきたいと思います。

今更ですがVPCエンドポイントにはゲートウェイ型とPrivateLink型があり、SESのVPCエンドポイントは PrivateLink型となっています。なぜこのような話をするかというと、料金体系が違うからです。ゲートウェイ型は設定してあるだけなら追加料金なしですが、PrivateLink型は設定してあると時間単位で料金が発生します。また、処理データ量によっても料金がかかります。(どちらもデータ転送量は別途発生します。)同じ「VPCゲートウェイ」でもこのような違いがあるので、ご注意ください。

じゃあPrivateLink型のVPCエンドポイントはどれくらいの料金がかかるの?というと、東京リージョンの場合は以下の通りです。(2021年3月時点)

●各 AZ の VPC エンドポイント 1 つあたりの料金 (USD/時間):0.014USD
●処理データ 1 GB あたりの料金 (USD):0.01USD

「各AZの」というのがミソです。例えば、1つのAZにVPCエンドポイントを作った時の1か月の料金を計算すると、0.014USD/時間 * 24時間 * 30日 ≒ 10.08USD ということで、為替レートにもよりますが、1,000円ちょっとになる計算です。もし2つのAZにVPCエンドポイントを作成したら、料金は倍の2,000円ちょっとになります。先ほど作ってみようと言って作ったSES用のVPCエンドポイントは3つのAZで動くものでしたので、1か月そのままにしていたら3,000円かかる計算です。結構高くないですか?

不要な料金がかかっていることに気付かず、あとからガッカリすることがないよう、ご注意ください。

おわりに

というわけで、プライベートサブネットからメールを送信する場合の説明でした!参考になれば幸いです。

お問い合わせ先

執筆者プロフィール

Chiba Kumiko
Chiba Kumikotdi デジタルイノベーション技術部
開発プロジェクトの技術支援や技術の検証に従事しているインフラエンジニアです。Unix/Linuxを扱う機会が多く、構築から運用保守まで一通り携わった経験があります。好きな言葉は「試験運用」。
Pocket

関連記事